package day12;

//volatile可见性
public class Demo {
    public static void main(String[] args) {
        new Visi1().start();
        new Visi2().start();

    }
}

class User {
    //volatile修饰变量  可以让该变量提供可见性
    //可以在不同的线程中可见
    //原因：每个线程都有自己的工作内存，多个线程之间还有一个主内存
    //只要被volalite修饰的变量，被其他人修改了，它就会让其他线程的工作内存失效
    //强制性刷新主内存的值 类似于static(保证对象之间共享) volatile(保证线程中的共享)
    static volatile int money = 1000;
}

class Visi1 extends Thread {
    //检测金额是否发生变化
    @Override
    public void run() {
        while (User.money == 1000) {
            //每次打印都是通过main(主内存) 所以有线程改变了，
            // 让主内存更新，该线程肯定可以识别
            System.out.println(User.money);
        }
        System.out.println("余额发生了变化");
    }
}

class Visi2 extends Thread {
    //3S之后修改余额
    @Override
    public void run() {
        try {
            Thread.sleep(3000);
            User.money = 1;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}